/*
 * @Author: mat
 * @Date: 2020-05-15 14:12:07
 * @LastEditTime: 2020-05-19 19:48:36
 * @Description: 全局公用的方法封装
 */

/* eslint-disable*/

/**
 * @description: 防抖： 在触发完事件的n秒内不再触发事件才执行
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} immediate 是否立刻触发
 * @param {*} context this指向
 */
function debounce(func, wait, immediate, context) {
  var timeout
  const debounced = function() {
    const args = arguments
    if (timeout) clearTimeout(timeout)
    if (immediate) {
      // 如果已经执行过，不再执行
      const callNow = !timeout
      timeout = setTimeout(function() {
        timeout = null
      }, wait)
      if (callNow) func.apply(context, args)
    } else {
      timeout = setTimeout(function() {
        func.apply(context, args)
      }, wait)
    }
  }
  debounced.cancel = function() {
    clearTimeout(timeout)
    timeout = null
  }
  return debounced
}

/**
 * @description: 节流： 如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function throttle(func, wait, context, options) {
  var timeout, args, result
  var previous = 0
  if (!options) options = {}

  var later = function() {
    previous = options.leading === false ? 0 : new Date().getTime()
    timeout = null
    func.apply(context, args)
    if (!timeout) args = null
  }

  var throttled = function() {
    var now = new Date().getTime()
    if (!previous && options.leading === false) previous = now
    var remaining = wait - (now - previous)
    args = arguments
    if (remaining <= 0 || remaining > wait) {
      if (timeout) {
        clearTimeout(timeout)
        timeout = null
      }
      previous = now
      func.apply(context, args)
      if (!timeout) args = null
    } else if (!timeout && options.trailing !== false) {
      timeout = setTimeout(later, remaining)
    }
  }
  return throttled
}
/**
 * @description: 简化版节流：使用时间戳实现，如果你持续触发事件，每隔一段时间，只执行一次事件
 * @param {*} func 回调方法
 * @param {*} wait 时间间隔
 * @param {*} context this指向
 * @param {*} options leading：false 表示禁用第一次执行 , railing: false 表示禁用停止触发的回调
 */
function simpleThrottle(func, wait, context) {
  var timeout, args
  return function() {
    args = arguments
    if (!timeout) {
      timeout = setTimeout(function() {
        timeout = null
        func.apply(context, args)
      }, wait)
    }
  }
}
function getArrayIndex(arrays, obj) {
  var i = arrays.length
  while (i--) {
    if (arrays[i] === obj) {
      return i
    }
  }
  return false
}

export { debounce, throttle, simpleThrottle, getArrayIndex }
